package com.反射Reflection.ClassLoad类加载;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;

public class ClassLoad__ {
    /**
     * 类加载时机
     * new 一个对象时加载                           静态加载
     * 当子类被加载时 父类也被加载                    静态加载
     * 调用类中的静态成员时（如果类未被加载过）也会加载   静态加载
     *
     * 反射获取Class类的对象                        动态加载
     */
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Scanner sc = new Scanner(System.in);
        String next = sc.next();
        switch (next) {
            case "1":
                /** 静态加载，依赖性很强，必须导入相应的包或类才能编译通过，否则报错
                 *  java: 找不到符号
                 *  符号:   类 Dog
                 */
                Dog dog = new Dog();
                dog.cry();
                break;
            case "2":
                /**
                 * 动态加载，编译时不会报错，只有当执行到当前代码块，才会检查是否有对应的类
                 * ，如果不用到case2 ，即使不存在这段代码也不会报错，降低了依赖性
                 * 如果该类不存在，又执行到代码块时才报错 ，例如
                 * Exception in thread "main" java.lang.ClassNotFoundException: com.反射Reflection.ClassLoad类加载.Person
                 */
                Class<?> cls = Class.forName("com.反射Reflection.ClassLoad类加载.Person");
                Object o = cls.getConstructor().newInstance();
                Method hi = cls.getMethod("hi");
                hi.invoke(o);
                break;
            default:
                System.out.println("default");
        }

       
    }
}
class Dog {
        public void cry(){
            System.out.println("小狗汪汪叫");
        }
}

class Person{
    public Person(){ }
    public void hi(){
        System.out.println("hi");
    }
}
